package arena.verOperaciones;

import org.uqbar.arena.actions.MessageSend;
import org.uqbar.arena.widgets.Button;
import org.uqbar.arena.widgets.Label;
import org.uqbar.arena.widgets.Panel;
import org.uqbar.arena.widgets.tables.Column;
import org.uqbar.arena.widgets.tables.Table;
import org.uqbar.arena.windows.Dialog;
import org.uqbar.arena.windows.WindowOwner;

import domain.Usuario;
import domain.operacion.Compra;

@SuppressWarnings("serial")
public abstract class VerOperacionDialog<T> extends Dialog<Usuario> {

	public VerOperacionDialog(WindowOwner owner, Usuario model) {
		super(owner, model);
	}

	@Override
	protected void createFormPanel(Panel mainPanel) {
		this.setTitle("Aterrizar.com");
		mainPanel.setVerticalLayout();
		this.crearCabecera(mainPanel);
		Table<T> todas = this.crearGrilla(mainPanel);
		this.describirColumnasPara(todas);
		crearBotonCerrar(mainPanel);
		
	}

	protected void crearBotonCerrar(Panel mainPanel) {
		Button cerrar = new Button(mainPanel);
		cerrar.setCaption("Cerrar");
		cerrar.onClick(new MessageSend(this, "cerrar"));
	}
	
	public void cerrar(){
		this.close();
	}

	protected void describirColumnasPara(Table<T> table) {
		crearColumna(table, "Salida", Compra.SALIDA);
		crearColumna(table, "Aerolinea", Compra.AEROLINEA);
		crearColumna(table, "Vuelo", Compra.VUELO);
		crearColumna(table, "Asiento", Compra.ASIENTO);
		crearColumna(table, "Precio", Compra.PRECIO);

	}

	private void crearColumna(Table<T> table, String tituloColumna, String nombreProperty) {
		Column<T> salidaColumn = new Column<T>(table);
		salidaColumn.setTitle(tituloColumna);
		salidaColumn.setFixedSize(100);
		salidaColumn.bindContentsToProperty(nombreProperty);
	}

	protected Table<T> crearGrilla(Panel mainPanel) {
		Table<T> operaciones = new Table<T>(mainPanel, this.getTipoOperacion());
		operaciones.setHeigth(150);
		operaciones.bindContentsToProperty(getOperacionesProperty());
		return operaciones;
	}

	protected void crearCabecera(Panel mainPanel) {
		Panel cabeceraPanel = new Panel(mainPanel);
		cabeceraPanel.setHorizontalLayout();
		Label inicio = new Label(cabeceraPanel);
		inicio.setText(this.getDescripcion() + " de ");
		
		Label nombre = new Label(cabeceraPanel);
		nombre.bindValueToProperty(Usuario.NOMBRE);
	}
	
	protected abstract String getDescripcion() ;
	protected abstract Class<T> getTipoOperacion();
	protected abstract String getOperacionesProperty();

}
